#include"controleur.h"

Controleur::Controleur()
{
    enseignants_ = EnsembleEns();
    etudiants_ = EnsembleEtu();
    sallescm_ = EnsembleSCM();
    sallestd_ = EnsembleSTD();
    sallestp_ = EnsembleSTP();
    modules_ = EnsembleMod();
    groupes_ = EnsembleGrp();
}

void Controleur::ajouterEnseignant(QString idens, QString nomens, QString prenomens, QString adresseens, QString mailens)
{
    enseignants_.ajoutEnseignant(new Enseignant(idens.toStdString(), nomens.toStdString(), prenomens.toStdString(), adresseens.toStdString(), mailens.toStdString()));
}

void Controleur::ajouterEtudiant(QString idens, QString nomens, QString prenomens, QString adresseens, QString mailens)
{
    etudiants_.ajoutEtudiant(new Etudiant(idens.toStdString(), nomens.toStdString(), prenomens.toStdString(), adresseens.toStdString(), mailens.toStdString()));
}

void Controleur::ajouterSalleCM(QString nums, QString capacite, const bool& b)
{
    sallescm_.ajoutSalleCM(new SalleCM(nums.toInt(), capacite.toInt(), b));
}

void Controleur::ajouterSalleTD(QString nums, QString capacite, const bool &b)
{
    sallestd_.ajoutSalleTD(new SalleTD(nums.toInt(), capacite.toInt(), b));
}

void Controleur::ajouterSalleTP(QString nums, QString capacite, QString nbmachines)
{
    sallestp_.ajoutSalleTP(new SalleTP(nums.toInt(), capacite.toInt(), nbmachines.toInt()));
}

void Controleur::ajouterModule(QString idmod, QString titre, QString heurecm, QString heuretd, QString heuretp, Enseignant *resp)
{
    modules_.ajoutModule(new Module(idmod.toInt(), titre.toStdString(), heurecm.toInt(), heuretd.toInt(), heuretp.toInt(), resp));
}

void Controleur::ajouterGroupe(QString nomgrp)
{
    groupes_.ajoutGroupe(new Groupe(nomgrp.toStdString()));
}

void Controleur::ajouterGroupe(QString nomgrp, EnsEtu ense, EnsMod suivi)
{
    groupes_.ajoutGroupe(new Groupe(nomgrp.toStdString(),ense, suivi));
}

void Controleur::ajouterCreneau(QDate* date, int heure, Salle *salle, Groupe *groupe, Module *module)
{
    Date d(date->day(), date->month(), date->year());
    creneaux_.ajoutCreneau(new Creneau(d,heure, groupe, salle, module));
}

EnsembleEns Controleur::getEnseignants()
{
    return enseignants_;
}

EnsembleEtu Controleur::getEtudiants()
{
    return etudiants_;
}

EnsembleSCM Controleur::getSallesCM()
{
    return sallescm_;
}

EnsembleSTD Controleur::getSallesTD()
{
    return sallestd_;
}

EnsembleSTP Controleur::getSallesTP()
{
    return sallestp_;
}

EnsembleMod Controleur::getModules()
{
    return modules_;
}

EnsembleGrp Controleur::getGroupes()
{
    return groupes_;
}

EnsembleCre Controleur::getCreneaux()
{
    return creneaux_;
}

EnsembleCre* Controleur::getCreneaux(QDate date)
{

    EnsembleCre* ensemble = new EnsembleCre();
    ensCreneau::iterator it;
    ensCreneau ens = creneaux_.getEnsembleCre();
    for(it=ens.begin(); it!=ens.end(); ++it)
    {
        QDate d((*it)->getDate().getYear(),
                (*it)->getDate().getMonth(),
                (*it)->getDate().getDay());

        if(d==date)
        {
            ensemble->ajoutCreneau((*it));
        }
    }
    return ensemble;
}

std::ostream& operator<<(std::ostream& os, Controleur c)
{
    ensEnseignant::iterator it;
    ensEnseignant ens = c.getEnseignants().getEnsembleEns();
    for(it=ens.begin(); it!=ens.end(); ++it)
    {
        os << (**it);
    }
    return os;
}

void Controleur::refreshTreeViewEns(QStandardItemModel *model)
{
    QStandardItem* item;
    model->removeRows(0,model->rowCount());
    ensEnseignant::iterator it;
    ensEnseignant ens = getEnseignants().getEnsembleEns();
    for(it=ens.begin(); it!=ens.end(); ++it)
    {
        item = new QStandardItem("Enseignant : " + QString::fromStdString((*it)->getNoen()));
        item->appendRow(new QStandardItem("Nom Enseignant : " + QString::fromStdString((*it)->getNom())));
        item->appendRow(new QStandardItem("Prenom Enseignant : " + QString::fromStdString((*it)->getPrenom())));
        item->appendRow(new QStandardItem("Adresse Postale : " + QString::fromStdString((*it)->getAdrPost())));
        item->appendRow(new QStandardItem("Adresse Electronique : " + QString::fromStdString((*it)->getAdrEl())));
        model->appendRow(item);
    }
}

void Controleur::refreshTreeViewEtu(QStandardItemModel *model)
{
    QStandardItem* item;
    model->removeRows(0,model->rowCount());
    ensEtudiant::iterator it;
    ensEtudiant etu = getEtudiants().getEnsembleEtu();
    for(it=etu.begin(); it!=etu.end(); ++it)
    {
        item = new QStandardItem("Etudiant : " + QString::fromStdString((*it)->getNoe()));
        item->appendRow(new QStandardItem("Nom Etudiant : " + QString::fromStdString((*it)->getNom())));
        item->appendRow(new QStandardItem("Prenom Etudiant : " + QString::fromStdString((*it)->getPrenom())));
        item->appendRow(new QStandardItem("Adresse Postale : " + QString::fromStdString((*it)->getAdrPost())));
        item->appendRow(new QStandardItem("Adresse Electronique : " + QString::fromStdString((*it)->getAdrEl())));
        model->appendRow(item);
    }
}

void Controleur::refreshTreeViewSalle(QStandardItemModel *model)
{
    QStandardItem* itemCM = new QStandardItem("Salle CM");
    QStandardItem* itemTD = new QStandardItem("Salle TD");
    QStandardItem* itemTP = new QStandardItem("Salle TP");
    model->removeRows(0,model->rowCount());
    model->appendRow(itemCM);
    model->appendRow(itemTD);
    model->appendRow(itemTP);
    refreshTreeViewSCM(itemCM);
    refreshTreeViewSTD(itemTD);
    refreshTreeViewSTP(itemTP);

}

void Controleur::refreshTreeViewSCM(QStandardItem *fItem)
{
    ensSalleCM::iterator it;
    ensSalleCM scm = getSallesCM().getEnsembleSCM();
    for(it=scm.begin(); it!=scm.end(); ++it)
    {
        QStandardItem* item = new QStandardItem("Numero de salle : " + QString::number((*it)->getNumSalle()));
        item->appendRow(new QStandardItem("Capacite : " + QString::number((*it)->getCapacite())));
        if((*it)->getVisioConf())
        {
            item->appendRow(new QStandardItem("VisioConference : Oui"));
        }
        else
        {
            item->appendRow(new QStandardItem("VisioConference : Non"));
        }
        fItem->appendRow(item);
    }
}

void Controleur::refreshTreeViewSTD(QStandardItem *fItem)
{
    ensSalleTD::iterator it;
    ensSalleTD std = getSallesTD().getEnsembleSTD();
    for(it=std.begin(); it!=std.end(); ++it)
    {
        QStandardItem* item = new QStandardItem("Numero de salle : " + QString::number((*it)->getNumSalle()));
        item->appendRow(new QStandardItem("Capacite : " + QString::number((*it)->getCapacite())));
        if((*it)->getVideoProj())
        {
            item->appendRow(new QStandardItem("VideoProjecteur : Oui"));
        }
        else
        {
            item->appendRow(new QStandardItem("VideoProjecteur : Non"));
        }
        fItem->appendRow(item);
    }
}

void Controleur::refreshTreeViewSTP(QStandardItem *fItem)
{
    ensSalleTP::iterator it;
    ensSalleTP stp = getSallesTP().getEnsembleSTP();
    for(it=stp.begin(); it!=stp.end(); ++it)
    {
        QStandardItem* item = new QStandardItem("Numero de salle : " + QString::number((*it)->getNumSalle()));
        item->appendRow(new QStandardItem("Capacite : " + QString::number((*it)->getCapacite())));
        item->appendRow(new QStandardItem("Nombre de machines : " + QString::number((*it)->getNbrMachine())));
        fItem->appendRow(item);
    }
}

void Controleur::refreshTreeViewMod(QStandardItemModel *model)
{
    QStandardItem* item;
    model->removeRows(0,model->rowCount());
    ensModule::iterator it;
    ensModule mod = getModules().getEnsembleMod();
    for(it=mod.begin(); it!=mod.end(); ++it)
    {
        item = new QStandardItem("Module : " + QString::number((*it)->getIdMod()));
        item->appendRow(new QStandardItem("Titre : " + QString::fromStdString((*it)->getTitre())));
        item->appendRow(new QStandardItem("Heures de CM : " + QString::number((*it)->getHCM())));
        item->appendRow(new QStandardItem("Heures de TD : " + QString::number((*it)->getHTD())));
        item->appendRow(new QStandardItem("Heures de TP : " + QString::number((*it)->getHTP())));
        item->appendRow(new QStandardItem("Enseignant Responsable : " + QString::fromStdString((*it)->getEnsResp()->getNom())+" "+QString::fromStdString((*it)->getEnsResp()->getPrenom())));
        model->appendRow(item);
    }
}


void Controleur::refreshTreeViewGrp(QStandardItemModel *model)
{
    QStandardItem* item;
    model->removeRows(0,model->rowCount());
    ensGroupe::iterator it;
    ensGroupe grp = getGroupes().getEnsembleGrp();
    for(it=grp.begin(); it!=grp.end(); ++it)
    {
        item = new QStandardItem("Groupe : " + QString::fromStdString((*it)->getNomGroupe()));
        /*ajout des etudiants à l'affichage de groupe*/
        QStandardItem* itemMem = new QStandardItem("Membres : ");
        QStandardItem* itemEtu;
        EnsEtu::iterator itm;
        for (itm = (*it)->getEnsEtudiant()->begin(); itm!=(*it)->getEnsEtudiant()->end(); ++itm)
        {
            itemEtu = new QStandardItem("Etudiant : " + QString::fromStdString((*itm)->getNoe()));
            itemEtu->appendRow(new QStandardItem("Nom Etudiant : " + QString::fromStdString((*itm)->getNom())));
            itemEtu->appendRow(new QStandardItem("Prenom Etudiant : " + QString::fromStdString((*itm)->getPrenom())));
            itemEtu->appendRow(new QStandardItem("Adresse Postale : " + QString::fromStdString((*itm)->getAdrPost())));
            itemEtu->appendRow(new QStandardItem("Adresse Electronique : " + QString::fromStdString((*itm)->getAdrEl())));
            itemMem->appendRow(itemEtu);
        }
        item->appendRow(itemMem);
        /*ajout des modules a l'affichages*/
        QStandardItem* itemSui = new QStandardItem("Suit : ");
        QStandardItem* itemMod;
        EnsMod::iterator ite;
        for (ite = (*it)->getEnsModule()->begin(); ite!=(*it)->getEnsModule()->end(); ++ite)
        {
            itemMod = new QStandardItem("Module : " + QString::number((*ite)->getIdMod()));
            itemMod->appendRow(new QStandardItem("Titre : " + QString::fromStdString((*ite)->getTitre())));
            itemMod->appendRow(new QStandardItem("Heures de CM : " + QString::number((*ite)->getHCM())));
            itemMod->appendRow(new QStandardItem("Heures de TD : " + QString::number((*ite)->getHTD())));
            itemMod->appendRow(new QStandardItem("Heures de TP : " + QString::number((*ite)->getHTP())));
            itemMod->appendRow(new QStandardItem("Enseignant Responsable : " + QString::fromStdString((*ite)->getEnsResp()->getNom())+" "+QString::fromStdString((*ite)->getEnsResp()->getPrenom())));
            itemSui->appendRow(itemMod);
        }
        item->appendRow(itemSui);
        model->appendRow(item);
    }
}

void Controleur::refreshTreeViewCre(QStandardItemModel *model)
{
    QStandardItem* item;
    model->removeRows(0, model->rowCount());
    ensCreneau::iterator it;
    ensCreneau cre = getCreneaux().getEnsembleCre();
    for(it=cre.begin(); it!=cre.end(); ++it)
    {
        item = new QStandardItem("Creneau du " + QString::number((*it)->getDate().getDay()) + "/" + QString::number((*it)->getDate().getMonth()) + "/" + QString::number((*it)->getDate().getYear()));
        item->appendRow(new QStandardItem("Commence à " + QString::number((*it)->getHeure()) + " Heure"));
        item->appendRow(new QStandardItem("Dans la salle " + QString::number((*it)->getSalle()->getNumSalle())));
        item->appendRow(new QStandardItem("avec le groupe " + QString::fromStdString((*it)->getGroupe()->getNomGroupe())));
        item->appendRow(new QStandardItem("pour le module " + QString::number((*it)->getModule()->getIdMod())));
        model->appendRow(item);
    }
}


void Controleur::getListEns(QStringList* listEns)
{
    ensEnseignant::iterator it;
    ensEnseignant ens = enseignants_.getEnsembleEns();
    for(it=ens.begin(); it!= ens.end(); ++it)
    {
        *listEns << QString("Enseignant : ") + QString::fromStdString((*it)->getNom() + " " + (*it)->getPrenom());
    }

}

void Controleur::getListSalle(QStringList *listSalle)
{
    ensSalleCM::iterator itCM;
    ensSalleCM scm = sallescm_.getEnsembleSCM();
    for(itCM=scm.begin(); itCM!=scm.end(); ++itCM)
    {
        *listSalle << QString("salle de CM : ") + QString::number((*itCM)->getNumSalle());
    }

    ensSalleTD::iterator itTD;
    ensSalleTD sTD = sallestd_.getEnsembleSTD();
    for(itTD=sTD.begin(); itTD!=sTD.end(); ++itTD)
    {
        *listSalle << QString("salle de TD : ") + QString::number((*itTD)->getNumSalle());
    }

    ensSalleTP::iterator itTP;
    ensSalleTP stp = sallestp_.getEnsembleSTP();
    for(itTP=stp.begin(); itTP!=stp.end(); ++itTP)
    {
        *listSalle << QString("salle de TP : ") + QString::number((*itTP)->getNumSalle());
    }
}

void Controleur::getListModule(QStringList *listMod)
{
    ensModule::iterator it;
    ensModule mod = modules_.getEnsembleMod();
    for(it=mod.begin(); it!=mod.end(); ++it)
    {
        *listMod << QString("Module : ") + QString::number((*it)->getIdMod());
    }
}

void Controleur::getListGroupe(QStringList *listgrp)
{
    ensGroupe::iterator it;
    ensGroupe grp = groupes_.getEnsembleGrp();
    for(it=grp.begin(); it!=grp.end(); ++it)
    {
        *listgrp << QString("Groupe : ") + QString::fromStdString((*it)->getNomGroupe());
    }
}

Enseignant* Controleur::getEnseignant(const int& index)
{
    ensEnseignant::iterator it;
    int i = index;
    ensEnseignant ens = enseignants_.getEnsembleEns();
    for(it=ens.begin(); it!=ens.end() && i!=0; ++it)
    {
        --i;
    }
    return (*it);
}

Etudiant* Controleur::getEtudiant(const std::string &str)
{
    Etudiant etu(str, "", "", "", "");
    return *(etudiants_.getEnsembleEtu().find(&etu));
}

Enseignant* Controleur::getEnseignant(const std::string &str)
{
    Enseignant ens(str, "", "","","");
    return *(enseignants_.getEnsembleEns().find(&ens));
}

Module* Controleur::getModule(const int &i)
{
    Enseignant ens("","","","","");
    Module mod(i, "", 0,0,0, &ens);
    return *(modules_.getEnsembleMod().find(&mod));
}

Groupe* Controleur::getGroupe(const std::string &str)
{
    Groupe grp(str);
    return *(groupes_.getEnsembleGrp().find(&grp));
}

SalleCM* Controleur::getSalleCM(const int &i)
{
    SalleCM scm(i, 0);
    return *(sallescm_.getEnsembleSCM().find(&scm));
}

SalleTD* Controleur::getSalleTD(const int &i)
{
    SalleTD sTD(i,0);
    return *(sallestd_.getEnsembleSTD().find(&sTD));
}

SalleTP* Controleur::getSalleTP(const int &i)
{
    SalleTP sTP(i,0,0);
    return *(sallestp_.getEnsembleSTP().find(&sTP));
}

void Controleur::ModifierEtudiant(QString idetu, QString nometu, QString prenometu, QString adresseetu, QString mailetu)
{
    Etudiant* etu = getEtudiant(idetu.toStdString());
    etu->setNom(nometu.toStdString());
    etu->setPrenom(prenometu.toStdString());
    etu->setAdrPost(adresseetu.toStdString());
    etu->setAdrEl(mailetu.toStdString());
}

void Controleur::ModifierEnseignant(QString idens, QString nomens, QString prenomens, QString adresseens, QString mailens)
{
    Enseignant* ens = getEnseignant(idens.toStdString());
    ens->setNom(nomens.toStdString());
    ens->setPrenom(prenomens.toStdString());
    ens->setAdrPost(adresseens.toStdString());
    ens->setAdrEl(mailens.toStdString());
}

void Controleur::ModifierSalleCM(QString noSalle, QString capacite, const bool &b)
{
    SalleCM* scm = getSalleCM(noSalle.toInt());
    scm->setCapacite(capacite.toInt());
    scm->setVisioConf(b);
}

void Controleur::ModifierSalleTD(QString noSalle, QString capacite, const bool &b)
{
    SalleTD* sTD = getSalleTD(noSalle.toInt());
    sTD->setCapacite(capacite.toInt());
    sTD->setVideoProj(b);
}

void Controleur::ModifierSalleTP(QString noSalle, QString capacite, QString nbm)
{
    SalleTP* stp = getSalleTP(noSalle.toInt());
    stp->setCapacite(capacite.toInt());
    stp->setNbrMachine(nbm.toInt());
}

void Controleur::SupprimerEtudiant(QString idetu)
{
    Etudiant* etu = getEtudiant(idetu.toStdString());
    etudiants_.supprEtudiant(etu);
}

void Controleur::SupprimerEnseignant(QString idens)
{
    Enseignant* ens = getEnseignant(idens.toStdString());
    enseignants_.supprEnseignant(ens);
}

void Controleur::SupprimerSalleCM(QString idsalle)
{
    SalleCM* scm = getSalleCM(idsalle.toInt());
    sallescm_.supprSalleCM(scm);
}

void Controleur::SupprimerSalleTD(QString idsalle)
{
    SalleTD* sTD = getSalleTD(idsalle.toInt());
    sallestd_.supprSalleTD(sTD);
}

void Controleur::SupprimerSalleTP(QString idsalle)
{
    SalleTP* sTP = getSalleTP(idsalle.toInt());
    sallestp_.supprSalleTP(sTP);
}

void Controleur::SupprimerModule(QString idmodule)
{
    Module* mod = getModule(idmodule.toInt());
    modules_.supprModule(mod);
}

void Controleur::SupprimerGroupe(QString nomgroupe)
{
    Groupe* grp = getGroupe(nomgroupe.toStdString());
    groupes_.supprGroupe(grp);
}
